import domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 构造方法：Constructor
 * 获取构造方法们
 * Constructor<?>[] getConstructors()
 * Constructor<T> getConstructor(类<?>... parameterTypes)
 * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
 * Constructor<?>[] getDeclaredConstructors()
 * 操作：
 * 创建对象：
 * T newInstance(Object... initargs)

 * 如果使用空参数构造方法创建对象，操作可以简化：Class对象的newInstance方法
 */

/**
 * 我定义的Person类中有两个构造方法：
 * public Person()
 * public Person(String name, int age)
 */
public class ClassFunction_Constructor {
    public static void main(String[] args) {
        try {
            //0.获取Person类的Class对象
            Class personClass = Person.class;
            //1.Constructor<?>[] getConstructors()：获取所有public修饰的成员变量构造方法
            Constructor[] constructors = personClass.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
                //输出结果：
                //public domain.Person()
                //public domain.Person(java.lang.String,int)
            }
            //2.Constructor<T> getConstructor(类<?>... parameterTypes)：获取指定参数列表的public修饰的构造方法
            Constructor constructor = personClass.getConstructor(String.class, int.class);
            System.out.println(constructor);//public domain.Person(java.lang.String,int)

            //3.T newInstance(Object... initargs)：传递构造方法的参数，创建对象。
            Object person1 = constructor.newInstance("AnonyEast", 20);
            System.out.println(person1);
            //输出结果：可以看到name和age已经被初始化
            //Person{name='AnonyEast', age=20, a='null', b='null', c='null', d='null'}

            //4.如果使用空参数构造方法创建对象，操作可以简化：使用Class对象的newInstance方法
            Object person2 = personClass.newInstance();
            System.out.println(person2);
            //输出结果：
            //Person{name='null', age=0, a='null', b='null', c='null', d='null'}
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
